/** 
* @Title: TraditionalThreadSynchronized.java 
* @Package com.lh.threadtest 
* @Description: TODO
* @author Liu 
* @date 2018年1月15日 下午6:38:24 
* @version V1.0 
*/
package com.lh.threadtest.t3;

import java.util.concurrent.TimeUnit;

/** 
* @ClassName: TraditionalThreadSynchronized 
* @Description: 传统线程互斥技术 (对象锁必须保证唯一性，即保证线程互斥性)
* @author Liu
* @date 2018年1月15日 下午6:38:24 
*  
*/
public class TraditionalThreadSynchronized4 {

	/***
	* @Title: main 
	* @Description: TODO
	* @param @param args
	* @return void
	* @throws 
	*/
	public static void main(String[] args) {
		new TraditionalThreadSynchronized4().init();
	}
	
	private void init(){
		final Outputer outputer = new Outputer();
		new Thread(new Runnable() {
			
			public void run() {
				while(true){
					try {
						TimeUnit.MILLISECONDS.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					outputer.output("zhangsan");
				}
			}
		}).start();
		
		new Thread(new Runnable() {
			
			public void run() {
				while(true){
					try {
						TimeUnit.MILLISECONDS.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					outputer.output2("lisi");
				}
			}
		}).start();
	}
	
	class Outputer{
		//方法名前加synchronized关键字！对整个方法体加锁！
		public void output(String name){
			synchronized (this) {
				for(int i = 0; i< name.length(); i++){
					System.out.print(name.charAt(i));
				}
				System.out.println();
			}
		}
		
		//方法名前的synchronized使用的锁默认是当前对象！
		public synchronized void output2(String name){
			//线程间是互斥的！！
			for(int i = 0; i< name.length(); i++){
				System.out.print(name.charAt(i));
			}
			System.out.println();
		}
	}

}
